﻿using QuanLyGiaoVuDAL.DTO;
using QuanLyGiaoVuDAL.Repositories.DatabaseRepositories;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuanLyGiaoVuService.CommandServices
{
    public class LichThiCommandService : ILichThiCommandService
    {
        private ILichThiRepository _lichThiRepository;
        private ILopMonHocRepository _lopMonHocRepository;

        public LichThiCommandService(ILichThiRepository lichThiRepository, ILopMonHocRepository lopMonHocRepository)
        {
            _lichThiRepository = lichThiRepository;
            _lopMonHocRepository = lopMonHocRepository;
        }

        public QuanLyGiaoVuDAL.DTO.LichThiDTO InsertLichThi(QuanLyGiaoVuDAL.DTO.LichThiDTO lichThiDTO)
        {
            var lopMonHocDTO = _lopMonHocRepository.GetLopMonHocById(lichThiDTO.MaLopMonHoc);
            lichThiDTO.LopMonHoc = lopMonHocDTO;
            var dsLichThi = _lichThiRepository.GetAllLichThi(lichThiDTO.LopMonHoc.MaHocKy, null, null, null);
            var dsLichThiTrungGio = dsLichThi.Where(lt => lt.MaLopMonHoc != lichThiDTO.MaLopMonHoc && lt.LopMonHoc.LopSinhVien.MaLop == lichThiDTO.LopMonHoc.LopSinhVien.MaLop);
            if (dsLichThiTrungGio != null)
            {
                int index = dsLichThiTrungGio.ToList().FindIndex(lichthi => !KiemTraTrungGio(lichthi, lichThiDTO));
                if (index != -1)
                    throw new Exception("Đã có lớp học thi vào thời gian này.");
            }
            if (lichThiDTO.MaLichThi.Equals(Guid.Empty))
                lichThiDTO.MaLichThi = Guid.NewGuid();
            return _lichThiRepository.InsertLichThi(lichThiDTO);
        }

        public QuanLyGiaoVuDAL.DTO.LichThiDTO UpdateLichThi(QuanLyGiaoVuDAL.DTO.LichThiDTO lichThiDTO)
        {
            var lopMonHocDTO = _lopMonHocRepository.GetLopMonHocById(lichThiDTO.MaLopMonHoc);
            lichThiDTO.LopMonHoc = lopMonHocDTO;
            var dsLichThi = _lichThiRepository.GetAllLichThi(lichThiDTO.LopMonHoc.MaHocKy, null, null, null).Where(lt => lt.MaLopMonHoc != lichThiDTO.MaLopMonHoc && lt.LopMonHoc.LopSinhVien.MaLop == lichThiDTO.LopMonHoc.LopSinhVien.MaLop).ToList();
            int index = dsLichThi.FindIndex(lichthi => !KiemTraTrungGio(lichthi, lichThiDTO));
            if (index != -1)
                throw new Exception("Đã có lớp học thi vào thời gian này.");
            return _lichThiRepository.UpdateLichThi(lichThiDTO);
        }

        public bool DeleteLichThi(Guid id)
        {
            return _lichThiRepository.DeleteLichThi(id);
        }

        private bool KiemTraTrungGio(LichThiDTO lichThi1, LichThiDTO lichThi2)
        {
            DateTime thoiGianKetThuc1 = lichThi1.NgayGio.AddMinutes(lichThi1.ThoiGianLamBai);
            DateTime thoiGianKetThuc2 = lichThi2.NgayGio.AddMinutes(lichThi2.ThoiGianLamBai);
            return (thoiGianKetThuc1 < lichThi2.NgayGio || thoiGianKetThuc2 < lichThi1.NgayGio);
        }
    }
}